package main

import "fmt"

// 声明一个接口
type Usb interface {
	Start()

	Stop()
}

type Phone struct {
	name string
}

func (p Phone) Start() {
	fmt.Printf("手机开始工作...")
}

func (p Phone) Stop() {
	fmt.Println("手机停止工作，，，")
}

func (p Phone) Call() {
	fmt.Println("手机正在通话。。。")
}

type Camera struct {
	name string
}

func (p Camera) Start() {
	fmt.Printf("相机开始工作...")
}

func (p Camera) Stop() {
	fmt.Println("相机停止工作，，，")
}

type Computer struct {
}

func (p Computer) Start() {
	fmt.Printf("计算机开始工作...")
}

func (p Computer) Stop() {
	fmt.Println("计算机停止工作，，，")
}

type Hello struct {
}

func (h Hello) Stop() {
	fmt.Println("implement me....")
}

func (h Hello) Start() {
	fmt.Println("em....")
}

// 接收一个Usb接口类型变量，只要是实现了Usb接口，
// 所谓实现，就是指实现了Usb接口所有声明方法
func (c Computer) Working(usb Usb) {
	usb.Start()

	if phone, ok := usb.(Phone); ok {
		phone.Call()
	}
	usb.Stop()
}

func main() {
	var usbArr [3]Usb
	usbArr[0] = Phone{"vivo"}
	usbArr[1] = Phone{"小米"}
	usbArr[2] = Camera{"康佳"}

	var computer Computer
	for _, v := range usbArr {
		computer.Working(v)
		fmt.Println()
	}
}
